using System;
using System.Text;

namespace PhraseCorrector.Common {

    /**
     * 短语纠错/匹配结果
     */
    public class PhraseResult : IComparable<PhraseResult> {

        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 获取或设置中文名称
        /// </summary>
        public string Chinese { get; set; }= "";

        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 英文/拼音
        /// </summary>
        public string Words { get; set; }= "";

        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 获取的数字
        /// </summary>
        public string Digits { get; set; }= "";

        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 原词符距离
        /// </summary>
        public double Distance { get; set; }= 0;

        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 匹配置信度
        /// </summary>
        public double Score { get; set; }= 0;

        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 返回当前实例的字符串表示形式。
        /// 格式为 {term, distance, count}。
        /// </summary>
        /// <returns>当前实例的字符串表示形式</returns>
        public override string ToString()
        {
            return new StringBuilder()
                .Append(GetTranslateResult())
                .AppendLine($"\t 错字数: {Distance}")
                .AppendLine($"\t 相似度: {Score.ToString("P2")}")
                .ToString();
        }

        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 获取枚举结果的文本表示。
        /// </summary>
        /// <returns>返回一个字符串，包含枚举结果的中文和英文描述。</returns>
        public string GetSegmenteResult()
        {
            return new StringBuilder()
            .AppendLine($"\n\t 中文汉字: {this.Chinese}")
            .AppendLine($"\t 西文拼音: {this.Words}")
            .ToString();
        }

        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 获取翻译结果的字符串表示。
        /// </summary>
        /// <returns>包含中文、西文和拼音的字符串表示。</returns>
        public string GetTranslateResult()
        {
            return new StringBuilder()
                .Append(GetSegmenteResult())
                .ToString();
        }

        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 获取枚举结果的文本表示。
        /// </summary>
        /// <returns>返回一个字符串，包含枚举结果的所有描述。</returns>
        public string GetResult() {
            return new StringBuilder()
                .Append(GetTranslateResult())
                .AppendLine($"\t 数字: {Digits}")
                .AppendLine($"\t 错字数: {Distance}")
                .AppendLine($"\t 相似度: {Score.ToString("P2")}")
                .ToString();
        }

        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 比较两个结果
        /// </summary>
        /// <remarks>
        /// 比较当前实例与指定对象的相似度
        /// 返回值：
        ///   -1：当前实例小于指定对象的相似度
        ///    0：当前实例等于指定对象的相似度
        ///   +1：当前实例大于指定对象的相似度
        /// </remarks>
        /// <param name="other"></param>
        /// <returns></returns>
        public int CompareTo(PhraseResult other) {
            if (Score == other.Score) return 0;
            return  other.Score > Score ? -1 : 1;
        }

        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 确定当前实例是否等于另一个对象。
        /// 如果对象相等则返回 true，否则返回 false。
        /// </summary>
        /// <param name="obj">要比较的另一个对象</param>
        /// <returns>如果对象相等则返回 true，否则返回 false</returns>
        public override bool Equals(object obj) {
            // 检查比较的对象是否为 null 或不是相同的类型
            if (obj == null || GetType() != obj.GetType()) return false;
            // 比较 term 属性是否相等
            PhraseResult other = (PhraseResult)obj;
            return Chinese == other.Chinese && Words == other.Words;
        }

        // /////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 返回当前对象的哈希代码
        /// </summary>
        /// <returns></returns>
        public override int GetHashCode() {
            return HashCode.Combine(Chinese, Words, Digits);
        }
    }
}
